#include <iostream>
#include <vector>
using namespace std;

// 全局变量，用于存储可行路线的总数
int totalRoutes = 0;
// 景区之间的连接矩阵
vector<vector<bool>> graph;
// 景区数量
int n;

// 深度优先搜索函数，用于寻找经过 4 个景区的简单路径
void dfs(int current, int visitedCount, vector<bool>& visited, vector<int>& path) {
    // 标记当前景区为已访问
    visited[current] = true;
    path.push_back(current);

    // 如果已经访问了 4 个景区，增加可行路线总数
    if (visitedCount == 4) {
        totalRoutes++;
    } else {
        // 遍历所有景区
        for (int i = 0; i < n; ++i) {
            // 如果当前景区和 i 景区之间有连接，且 i 景区未被访问
            if (graph[current][i] &&!visited[i]) {
                // 递归调用 dfs 函数继续搜索
                dfs(i, visitedCount + 1, visited, path);
            }
        }
    }

    // 回溯，将当前景区标记为未访问，并从路径中移除
    visited[current] = false;
    path.pop_back();
}

int main() {
    cin >> n;
    graph.resize(n, vector<bool>(n, false));

    // 读取景区之间的连接信息
    for (int i = 0; i < n; ++i) {
        string row;
        cin >> row;
        for (int j = 0; j < n; ++j) {
            graph[i][j] = (row[j] == '1');
        }
    }

    // 从每个景区开始进行深度优先搜索
    for (int start = 0; start < n; ++start) {
        vector<bool> visited(n, false);
        vector<int> path;
        dfs(start, 1, visited, path);
    }

    cout << totalRoutes << endl;

    return 0;
}